package com.miracle.基础和源码.泛型;


class Animal <E extends String,F>{


    public static void main(String[] args) {

        Panada panada = new Panada();
        //eat都是可以接收Double和Double的子类
        panada.eat(new Food<Double>(new Double("22")));
        panada.eat2(new Food<Double>(new Double("22")));
    }

}
class Panada{
    /**
     * eat使用Food作为参数时还不确定是什么类型，但确定是Double的子类，可以使用通配符限制，但是只能用来限制参数aa的类型，后续不能再使用，可以看到接收foo也只能使用Double
     * @param aa
     */
    public void eat(Food<? extends Double> aa){
        Double foo = aa.foo;
        System.out.println("Panada eating:"+aa.foo+". . . ");
    }

    /**
     * 但如果使用<T extends Double>会定义一个泛型T，可以在方法内继续复用，可以使用T接收foo
     * @param aa
     * @param <T>
     * @return
     */
    public <T extends Double> T eat2(Food<T> aa){
        T foo = aa.foo;
        System.out.println("Panada eating:"+foo+". . . ");
        return foo;
    }
}

/**
 * Food限制了传入参数是Number的子类
 * @param <T>
 */
class Food<T extends Number>{
    T foo;
    Food(T t){
        this.foo = t;
    }
}

